/*
 * @Author: your name
 * @Date: 2021-10-14 13:54:14
 * @LastEditTime: 2021-11-10 11:25:32
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \web-maps\src\util\color\index.js
 */

import { rgb } from "d3-color";
import { Filter } from "/@/util/algorithm/filter";
import { transformColors } from "./util";

type ColorClassifyType = {
  el: string[];
  palette: Array<() => (t: number) => string>;
};

enum ColorType {
  hex,
  rgb,
}

/**
 * @description 降雨调色板
 */
export const RainColors = [
  // "rgb(97, 88, 130)",
  // "rgb(97, 88, 130)",
  // "rgb(97, 88, 130)",
  "rgb(110, 110, 110)",
  "rgb(97, 88, 130)",
  "rgb(73, 102, 142)",
  "rgb(52, 117, 143)",
  "rgb(42, 123, 140)",
  "rgb(31, 129, 137)",
  "rgb(11, 141, 130)",
  "rgb(92, 154, 100)",
  "rgb(251, 158, 191)",
  "rgb(249, 162, 193)",
  // "rgb(249, 162, 193)",
];

export const RainColors2 = [
  "rgb(110, 110, 110)",
  "rgba(82, 71, 141, 0.38)",
  "rgba(85, 78, 177, 0.5)",
  "rgba(64, 160, 180, 0.87)",
  "rgba(76, 196, 92, 0.87)",
  "rgba(69, 206, 66, 0.87)",
  "rgba(149, 219, 70, 0.87)",
  "rgba(190, 228, 61, 0.87)",
  "rgba(220, 234, 55, 0.87)",
  "rgba(235, 206, 53, 0.87)",
  "rgba(234, 164, 62, 0.87)",
  "rgba(233, 123, 72, 0.87)",
  "rgba(225, 94, 93, 0.87)",
  "rgba(217, 66, 114, 0.87)",
  "rgba(190, 48, 102, 0.87)",
  "rgba(175, 46, 90, 0.87)",
  "rgb(147, 23, 78)",
  "rgb(114, 22, 56)",
  "rgb(84, 16, 41)",
];

/**
 * @description BLENDER 调色板
 */
// export const RainColors = [
//   "rgb(166,242,143)",
//   "rgb(166,242,143)",
//   "rgb(56,168,0)",
//   "rgb(97,184,255)",
//   "rgb(0,0,255)",
//   "rgb(250,0,250)",
//   "rgb(115,0,0)",
//   "rgb(64,0,0)",
// ];

/**
 * @description 温度调色板
 */
export const TempColors = [
  "rgb(149, 137, 211)",
  "rgb(150, 209, 216)",
  "rgb(129, 204, 197)",
  "rgb(103, 180, 186)",
  "rgb(95, 143, 197)",
  "rgb(80, 140, 62)",
  "rgb(121, 146, 28)",
  "rgb(171, 161, 14)",
  "rgb(223, 177, 6)",
  "rgb(243, 150, 6)",
  "rgb(236, 95, 21)",
  "rgb(190, 65, 18)",
  "rgb(138, 43, 10)",
];

/**
 * @description 湿度调色板
 */
export const HumidityColors = [
  "rgb(110, 110, 110)",
  "rgb(174, 110, 56)",
  "rgb(174, 146, 56)",
  "rgb(105, 174, 56)",
  "rgb(54, 175, 148)",
  "rgb(56, 158, 174)",
  "rgb(56, 142, 174)",
  "rgb(56, 133, 174)",
  "rgb(56, 111, 166)",
  "rgb(56, 71, 116)",
  "rgb(56, 71, 116)",
];

/**
 * @description 雨
 */
export const RainColors1 = [
  "rgb(110, 110, 110)",
  "rgb(59, 128, 162)",
  "rgb(58, 133, 162)",
  "rgb(58, 137, 162)",
  "rgb(58, 153, 162)",
  "rgb(50, 166, 111)",
  "rgb(74, 164, 57)",
  "rgb(129, 162, 59)",
  "rgb(162, 162, 59)",
  "rgb(162, 60, 59)",
  "rgb(171, 54, 107)",
  "rgb(164, 58, 154)",
];

/**
 * @description 风
 */
export const WindColors = [
  "rgb(98, 113, 184)",
  "rgb(61, 110, 163)",
  "rgb(74, 148, 170)",
  "rgb(74, 146, 148)",
  "rgb(77, 142, 124)",
  "rgb(76, 164, 76)",
  "rgb(103, 164, 54)",
  "rgb(162, 135, 64)",
  "rgb(162, 109, 92)",
  "rgb(141, 63, 92)",
  "rgb(151, 75, 145)",
  "rgb(95, 100, 160)",
  "rgb(91, 136, 161)",
];

/**
 * 地表覆盖
 */
export const LANDColor = [
  rgb(110, 110, 110),
  rgb(59, 202, 66),
  rgb(34, 149, 39),
  rgb(31, 125, 39),
  rgb(28, 115, 36),
];

export const WILTColor = [
  rgb(110, 110, 110),
  rgb(164, 123, 39),
  rgb(202, 202, 202),
  rgb(63, 150, 159),
  rgb(50, 89, 124),
  rgb(48, 48, 94),
];

const ALBDOColor = [
  rgb(110, 110, 110),
  rgb(110, 110, 110),
  rgb(110, 110, 110),
  rgb(0, 161, 247),
  rgb(0, 230, 0),
  rgb(0, 190, 0),
  rgb(0, 138, 0),
  rgb(255, 255, 0),
  rgb(240, 220, 0),
  rgb(255, 160, 0),
  rgb(254, 172, 172),
  rgb(254, 100, 92),
  rgb(238, 2, 48),
  rgb(235, 0, 195),
  rgb(155, 0, 185),
  rgb(173, 145, 241),
];

const ABSVColor = [
  rgb(110, 110, 110),
  rgb(161, 1, 197),
  rgb(130, 0, 223),
  rgb(0, 161, 255),
  rgb(0, 200, 206),
  rgb(0, 220, 1),
  rgb(232, 221, 45),
  rgb(229, 176, 44),
  rgb(250, 61, 55),
  rgb(236, 3, 129),
];
// export const TempColors1 = [
//   "#640064",
//   "#7A007A",
//   "#930093",
//   "#AD00AD",
//   "#BA00BA",
//   "#C600C6",
//   "#D300D3",
//   "#B40AD6",
//   "#761BD1",
//   "#442AC9",
//   "#2D38CE",
//   "#2143DD",
//   "#1254ED",
//   "#1254ED",
//   "#0065FF",
//   "#0083DB",
//   "#0092B7",
//   "#009393",
//   "#00A07D",
//   "#00AF63",
//   "#00BF42",
//   "#00CE1B",
//   "#12E200",
//   "#49F400",
//   "#6EFF00",
//   "#7FFF00",
//   "#90FF00",
//   "#A1FF00",
//   "#B2FF00",
//   "#BFFF00",
//   "#CCFF00",
//   "#DDFF00",
//   "#EEFF00",
//   "#FFFF00",
//   "#FFEE00",
//   "#FFDD00",
//   "#FFCC00",
//   "#FFBF00",
//   "#FFB200",
//   "#FFA100",
//   "#FF9400",
//   "#FF8C00",
//   "#FF8300",
//   "#FF7B00",
//   "#FF5900",
//   "#FF3700",
//   "#FF1500",
// ];

export const TempColors1 = [
  // "rgb(110, 110, 110)",
  "rgb(0,47,255)",
  "rgb(20,100,210)",
  "rgb(30,110,235)",
  "rgb(40,130,240)",
  "rgb(60,150,245)",
  "rgb(80,165,245)",
  "rgb(120,185,250)",
  "rgb(150,210,250)",
  "rgb(180,240,250)",
  "rgb(225,255,255)",
  "rgb(255,255,255)",
  "rgb(255,250,170)",
  "rgb(255,232,120)",
  "rgb(255,192,60)",
  "rgb(255,160,0)",
  "rgb(255,50,0)",
  "rgb(225,20,0)",
  "rgb(192,0,0)",
  "rgb(165,0,0)",
  "rgb(255,0,206)",
];

/**
 * @description 最高温
 */
export const TempMAXColor = [
  "rgb(0,95,255)",
  "rgb(0,127,255)",
  "rgb(0,159,255)",
  "rgb(0,191,255)",
  "rgb(0,223,255)",
  "rgb(255,255,255)",
  "rgb(248,212,177)",
  "rgb(251,202,202)",
  "rgb(248,177,201)",
  "rgb(239,158,158)",
  "rgb(253,116,116)",
  "rgb(252,114,88)",
  "rgb(251,67,32)",
  "rgb(226,40,4)",
  "rgb(176,31,3)",
  "rgb(126,22,2)",
  "rgb(75,13,1)",
  "rgb(50,9,1)",
];

/**
 * @description 最低温
 */
export const TempMinColor = [
  "rgb(57,0,57)",
  "rgb(156,0,156)",
  "rgb(255,0,255)",
  "rgb(156,0,255)",
  "rgb(49,0,255)",
  "rgb(0,101,255)",
  "rgb(0,203,255)",
  "rgb(0,231,165)",
  "rgb(0,231,123)",
  "rgb(0,243,41)",
  "rgb(166,239,16)",
  "rgb(157,220,91)",
  "rgb(255,255,255)",
  "rgb(235,197,20)",
  "rgb(236,155,75)",
  "rgb(255,150,0)",
  "rgb(231,125,0)",
  "rgb(239,101,0)",
  "rgb(222,77,33)",
  "rgb(206,48,33)",
  "rgb(189,28,33)",
  "rgb(181,0,49)",
  "rgb(206,0,99)",
  "rgb(255,0,156)",
];

/**
 * @description 露点温度
 */
export const TempDewPointColor = [
  rgb(14, 89, 13),
  rgb(15, 160, 15),
  rgb(30, 180, 30),
  rgb(80, 240, 80),
  rgb(150, 245, 140),
  rgb(200, 255, 190),
  rgb(230, 241, 216),
  rgb(255, 255, 255),
];

// export const RHColor = [
//   rgb(0, 255, 0),
//   rgb(0, 255, 0),
//   rgb(0, 255, 0),
//   rgb(0, 0, 0),
//   rgb(0, 200, 50),
//   rgb(0, 209, 111),
//   rgb(0, 218, 181),
//   rgb(0, 201, 228),
//   rgb(0, 142, 237),
//   rgb(0, 73, 246),
//   rgb(0, 3, 255),
// ];

export const RHColor = [
  rgb(110, 110, 110),
  rgb(174, 110, 56),
  rgb(174, 146, 56),
  rgb(105, 174, 56),
  rgb(54, 175, 148),
  rgb(56, 158, 174),
  rgb(56, 142, 174),
  rgb(56, 133, 174),
  rgb(56, 111, 166),
  rgb(56, 71, 116),
  rgb(56, 71, 116),
];

export const FrozenHeightColors = [
  "rgb(110, 110, 110)",
  "rgb(189, 198, 196)",
  "rgb(156, 196, 190)",
  "rgb(81, 142, 130)",
  "rgb(68, 132, 120)",
  "rgb(55, 123, 110)",
  "rgb(33, 67, 73)",
  "rgb(32, 55, 71)",
  "rgb(30, 47, 69)",
  "rgb(29, 38, 66)",
  "rgb(29, 38, 66)",
];

/**
 * 云顶
 */
const GentingColors = [
  "rgb(110, 110, 110)",
  "rgb(111, 111, 111)",
  "rgb(96, 116, 133)",
  "rgb(72, 139, 146)",
  "rgb(72, 169, 113)",
  "rgb(128, 191, 68)",
  "rgb(190, 163, 62)",
  "rgb(178, 81, 80)",
  "rgb(187, 76, 131)",
  "rgb(179, 80, 179)",
  "rgb(179, 80, 179)",
];

/**
 * 云底
 * @returns
 */
const CloudsColors = [
  rgb(110, 110, 110),
  rgb(167, 93, 166),
  rgb(164, 96, 162),
  rgb(168, 91, 91),
  rgb(98, 122, 161),
  rgb(98, 122, 161),
  rgb(90, 169, 92),
  rgb(91, 168, 99),
];

/**
 * 积雪
 */
const SnowColors = [
  rgb(110, 110, 110),
  rgb(70, 83, 151),
  rgb(67, 97, 160),
  rgb(64, 113, 164),
  rgb(62, 139, 166),
  rgb(65, 163, 167),
  rgb(95, 154, 56),
  rgb(168, 169, 65),
  rgb(171, 134, 62),
  rgb(172, 95, 62),
  rgb(174, 62, 86),
  rgb(177, 60, 116),
];

/**
 * 雷达
 *
 */
const RadarColor = [
  rgb(110, 110, 110),
  rgb(110, 110, 110),
  rgb(40, 16, 159),
  rgb(0, 109, 154),
  rgb(70, 205, 96),
  rgb(195, 219, 38),
  rgb(245, 203, 8),
  rgb(244, 159, 33),
  rgb(223, 102, 68),
  rgb(190, 52, 94),
  rgb(157, 16, 109),
  rgb(117, 0, 107),
  rgb(87, 0, 94),
];

/**
 * 浪涌
 *
 */
const SurgeColor = [
  rgb(110, 110, 110),
  rgb(50, 158, 186),
  rgb(48, 128, 164),
  rgb(48, 99, 142),
  rgb(52, 101, 166),
  rgb(56, 104, 192),
  rgb(56, 83, 169),
  rgb(57, 61, 143),
  rgb(134, 48, 49),
  rgb(194, 76, 91),
  rgb(192, 118, 105),
  rgb(192, 162, 157),
];

/**
 * 可降水
 */
const OverColor = [
  rgb(110, 110, 110),
  rgb(59, 126, 162),
  rgb(59, 128, 162),
  rgb(58, 133, 162),
  rgb(58, 137, 162),
  rgb(58, 153, 162),
  rgb(50, 166, 111),
  rgb(74, 164, 57),
  rgb(129, 162, 59),
  rgb(162, 162, 59),
  rgb(162, 60, 59),
  rgb(171, 54, 107),
  rgb(164, 58, 154),
];

/**
 * 能见度
 */
export const VISColor = [
  rgb(162, 89, 164),
  rgb(168, 86, 86),
  rgb(89, 99, 164),
  rgb(70, 180, 74),
  rgb(91, 158, 85),
  rgb(110, 110, 110),
];

/**
 * 云
 */
export const CloudColor = [
  rgb(110, 110, 110),
  rgb(117, 158, 137),
  rgb(127, 159, 159),
  rgb(131, 162, 162),
  rgb(134, 164, 164),
  rgb(136, 166, 166),
  rgb(140, 169, 169),
  rgb(187, 188, 188),
];

/**
 * 低云
 */

export const LowCloudColor = [
  rgb(110, 110, 110),
  rgb(110, 110, 110),
  rgb(110, 110, 110),
  rgb(133, 130, 119),
  rgb(131, 133, 136),
  rgb(132, 140, 147),
  rgb(134, 145, 156),
  rgb(135, 150, 165),
  rgb(137, 157, 178),
  rgb(187, 187, 188),
];

/**
 * 中云
 */

export const InCloudColor = [
  rgb(110, 110, 110),
  rgb(110, 110, 110),
  rgb(110, 110, 110),
  rgb(152, 180, 135),
  rgb(156, 190, 156),
  rgb(154, 186, 154),
  rgb(152, 182, 152),
  rgb(150, 179, 150),
  rgb(147, 173, 147),
  rgb(187, 188, 187),
];

/**
 * 高云
 */

export const HCloudColor = [
  rgb(110, 110, 110),
  rgb(110, 110, 110),
  rgb(110, 110, 110),
  rgb(117, 158, 137),
  rgb(127, 159, 159),
  rgb(131, 162, 162),
  rgb(134, 164, 164),
  rgb(136, 166, 166),
  rgb(140, 169, 169),
  rgb(187, 188, 188),
];
/**
 * 对流有效位能
 */
export const CAPEColor = [
  rgb(110, 110, 110),
  rgb(110, 110, 110),
  rgb(38, 98, 145),
  rgb(67, 169, 33),
  rgb(164, 162, 55),
  rgb(156, 113, 63),
  rgb(163, 56, 55),
  rgb(166, 57, 104),
  rgb(152, 68, 151),
];

export const PressureColor = [
  rgb(110, 110, 110),
  rgb(0, 103, 148),
  rgb(0, 117, 147),
  rgb(18, 134, 147),
  rgb(72, 154, 152),
  rgb(140, 178, 168),
  rgb(178, 176, 157),
  rgb(167, 142, 99),
  rgb(163, 111, 63),
  rgb(160, 82, 44),
];

/**
 * 高度
 *
 */

export const HGTColor = [
  rgb(110, 110, 110),
  rgb(50, 158, 186),
  rgb(48, 128, 164),
  rgb(48, 99, 142),
  rgb(52, 101, 166),
  rgb(56, 104, 192),
  rgb(56, 83, 169),
  rgb(57, 61, 143),
  rgb(134, 48, 49),
  rgb(194, 76, 91),
  rgb(192, 118, 105),
  rgb(192, 162, 157),
];

/**
 *
 * 臭氧
 */
export const TOZNEColor = [
  rgb(147, 70, 184),
  rgb(84, 133, 207),
  rgb(77, 170, 187),
  rgb(79, 192, 175),
  rgb(73, 204, 142),
  rgb(67, 201, 54),
  rgb(177, 186, 0),
  rgb(177, 186, 0),
];

/**
 *
 * 日照时间
 */
export const SUNSDColor = [
  rgb(110, 110, 110),
  rgb(238, 104, 61),
  rgb(249, 148, 84),
  rgb(253, 174, 108),
  rgb(252, 198, 125),
  rgb(252, 225, 157),
  rgb(255, 253, 193),
  rgb(227, 236, 179),
  rgb(200, 223, 153),
  rgb(157, 216, 221),
  rgb(55, 197, 250),
  rgb(0, 147, 206),
];
const baseRainColor = () => transformColors(RainColors);

const baseRainColor1 = () => transformColors(RainColors1);

const baseRainColor2 = () => transformColors(RainColors2);

const baseTempColor = () => transformColors(TempColors);

const baseTempColor1 = () => transformColors(TempColors1);
// transformColors(TempColors1.map((i) => colorHexToRgb(i)));

const baseHumidityColor = () => transformColors(HumidityColors);

const baseWindColor = () => transformColors(WindColors);

const baseFrozenHeightColor = () => transformColors(FrozenHeightColors);

const baseSnowColors = () => transformColors(SnowColors);

const baseRadarColor = () => transformColors(RadarColor);

const baseSurgeColor = () => transformColors(SurgeColor);

const basePressureColor = () => transformColors(PressureColor);

const baseTempMAXColor = () => transformColors(TempMAXColor);

const baseTempMinColor = () => transformColors(TempMinColor);

const baseTempDewPointColor = () => transformColors(TempDewPointColor);

const baseRHColor = () => transformColors(RHColor);

const baseTOZNEColors = () => transformColors(TOZNEColor);

const baseLANDColors = () => transformColors(LANDColor);

const baseALBDOColors = () => transformColors(ALBDOColor);

/**
 * 云顶
 */
const baseGentingColors = () => transformColors(GentingColors);

const baseCloudsColors = () => transformColors(CloudsColors);

/**
 *
 *高云
 */
const baseHCloudsColors = () => transformColors(HCloudColor);

/**
 *
 *低云
 */
const baseLCloudsColors = () => transformColors(LowCloudColor);

/**
 *
 *中云
 */
const baseInCloudColors = () => transformColors(InCloudColor);

/**
 *
 * 对流有效位能
 */
const baseCAPEColors = () => transformColors(CAPEColor);

/**
 *
 * 能见度
 */
const baseVISColors = () => transformColors(VISColor);

/**
 * 可降水
 */
const baseOverColors = () => transformColors(OverColor);

const baseHGTColors = () => transformColors(HGTColor);

/**
 * 日照时间
 */
const baseSUNSDColors = () => transformColors(SUNSDColor);

const baseWILTColor = () => transformColors(WILTColor);

const baseABSVColor = () => transformColors(ABSVColor);

const ColorClassify: ColorClassifyType[] = [
  {
    el: ["DPT", "TEMP"],
    palette: [baseTempColor, baseTempColor1],
  },
  {
    el: ["RAIN"],
    palette: [baseRainColor, baseRainColor1],
  },
  {
    el: ["WIND"],
    palette: [baseWindColor],
  },
];

type BasePalette = {
  palette: () => (t: number) => string;
  filter?: Filter[];
};
const getBasePalette = function (modelName: string) {
  const palette = {} as BasePalette;
  switch (modelName) {
    case "APCP":
    case "ACPCP":
    case "RAIN12":
    case "RAIN03":
    case "RAIN01":
    case "RAIN24":
    case "CWAT":
      palette.palette = baseRainColor1;
      palette.filter = [["!=", 0]];
      break;
    case "TMP":
    case "POT":
      palette.palette = baseTempColor;
      break;
    case "TMAX":
      palette.palette = baseTempMAXColor;
      break;
    case "TMIN":
      palette.palette = baseTempMinColor;
      break;
    case "DPT":
    case "DPT_2M":
      palette.palette = baseTempColor;
      break;
    case "RH":
      palette.palette = baseRHColor;
      palette.filter = [[">=", 20]];
      break;
    case "UGRD":
    case "VGRD":
    case "WIND":
    case "WIND_10M":
      palette.palette = baseWindColor;
      break;
    case "PRMSL":
    case "PRES":
      palette.palette = basePressureColor;
      break;
    case "TCDC":
      palette.palette = baseHCloudsColors;
      palette.filter = [["!=", 0]];
      break;
    case "SPFH":
      palette.palette = baseRHColor;
      palette.filter = [["!=", 0]];
      break;
    case "PWAT":
      palette.palette = baseOverColors;
      palette.filter = [["!=", 0]];
      break;
    case "SNOD":
    case "CSNOW":
      palette.palette = baseSnowColors;
      palette.filter = [["!=", 0]];
      break;
    case "VIS":
      palette.palette = baseVISColors;
      palette.filter = [["!=", 0]];
      break;
    case "LCDC":
      palette.palette = baseLCloudsColors;
      palette.filter = [["!=", 0]];
      break;
    case "CAPE":
      palette.palette = baseCAPEColors;
      palette.filter = [["!=", 0]];
      break;
    case "MCDC":
      palette.palette = baseInCloudColors;
      palette.filter = [["!=", 0]];
      break;
    case "HGT":
      palette.palette = baseHGTColors;
      palette.filter = [["!=", 0]];
      break;
    case "ICEC":
    case "ICEG":
    case "ICETK":
      palette.palette = baseFrozenHeightColor;
      palette.filter = [["!=", 0]];
      break;
    case "TOZNE":
      palette.palette = baseTOZNEColors;
      palette.filter = [["!=", 0]];
      break;
    case "SUNSD":
      palette.palette = baseSUNSDColors;
      palette.filter = [["!=", 0]];
      break;
    case "LAND":
      palette.palette = baseLANDColors;
      break;
    case "WILT":
      palette.palette = baseWILTColor;
      break;
    case "ALBDO":
      palette.palette = baseRadarColor;
      break;
    case "ABSV":
      palette.palette = baseABSVColor;
      break;
    default:
      palette.palette = baseTempColor;
      break;
  }

  return palette;
  // //  const palette = ColorClassify.find((i)=> i.el.includes(modelName.toUpperCase()))
  // const palette = ColorClassify.find((i) =>
  //   i.el.map((j) => j.includes(modelName))
  // );
  // return palette?.palette || [baseRainColor];
};

export {
  baseRainColor,
  baseRainColor1,
  baseRainColor2,
  baseTempColor,
  baseTempColor1,
  baseHumidityColor,
  baseWindColor,
  baseFrozenHeightColor,
  baseGentingColors,
  baseCloudsColors,
  baseSnowColors,
  baseRadarColor,
  baseSurgeColor,
  basePressureColor,
  getBasePalette,
  baseTempMAXColor,
  baseTempMinColor,
  baseTempDewPointColor,
  baseRHColor,
  baseHCloudsColors,
  baseLCloudsColors,
  baseInCloudColors,
  baseCAPEColors,
  baseVISColors,
  baseOverColors,
  baseHGTColors,
  baseTOZNEColors,
  baseALBDOColors,
};
